﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Sistema_financiero
{
    public partial class frm_Alta_Prestamo : Form
    {
        public List<Entidades.Cuota> Lista_cuotas = new List<Sistema_financiero.Entidades.Cuota>();
        public List<Entidades.Cliente> Lista_garantes = new List<Sistema_financiero.Entidades.Cliente>();
        public DateTime Fecha { get; set; }
        public Entidades.Cliente Garante_quitar = new Sistema_financiero.Entidades.Cliente();

        public frm_Alta_Prestamo()
        {
            InitializeComponent();
            btn_Calcular.Enabled = false;
            tbx_Num_prestamo.Text = Convert.ToString(Entidades.Prestamo.Obtener_id_prestamo());
            btn_Aceptar.Enabled = false;
            Fecha = Control.Fecha_dia_habil.Obtener_fecha_habil_30_dias(DateTime.Now);
            mtbx_Fecha_vencimiento.Text = Convert.ToString(Fecha); ;
        }

        private void lbl_Tasa_punitorio_Click(object sender, EventArgs e)
        {

        }

        private void tbx_Tasa_punitorio_TextChanged(object sender, EventArgs e)
        {

        }

        private void btn_Calcular_Click(object sender, EventArgs e)
        {
            frm_Calcular_Cuotas Calcular_cuotas = new frm_Calcular_Cuotas();
            Calcular_cuotas.ShowDialog();

            if (Calcular_cuotas.Cuotas_seleccionada != null)
            {
                tbx_Importe.Text = Convert.ToString(Calcular_cuotas.Cuotas_seleccionada.Importe);
                tbx_Instituto_informe.Text = Convert.ToString(Calcular_cuotas.Cuotas_seleccionada.Instituto_informe);
                tbx_Numero_cuotas.Text = Convert.ToString(Calcular_cuotas.Cuotas_seleccionada.Numero);
                mtbx_Sellado.Text = Convert.ToString(Calcular_cuotas.Cuotas_seleccionada.Sellado);
                mtbx_TEM.Text = Convert.ToString(Calcular_cuotas.Cuotas_seleccionada.Tem);
            }
        }

        private void frm_Alta_Prestamo_Load(object sender, EventArgs e)
        {

        }
        private void mtbx_TEM_Leave(object sender, EventArgs e)
        {
            
        }

        private void mtbx_Sellado_Leave(object sender, EventArgs e)
        {
            Control.Textbox_restricciones.Validar_mascara(mtbx_Sellado, e);
        }

        private void btn_buscar_Click(object sender, EventArgs e)
        {
            frm_Buscar_Cliente Buscar_cliente = new frm_Buscar_Cliente();
            Buscar_cliente.ShowDialog();
            if (Buscar_cliente.Cliente_seleccionado != null)
            {
                dgv_Cuotas.DataSource = null;
                tbx_Apellido.Text = Buscar_cliente.Cliente_seleccionado.Apellido;
                tbx_Nombre.Text = Buscar_cliente.Cliente_seleccionado.Nombres;
                tbx_Num_cliente.Text = Convert.ToString(Buscar_cliente.Cliente_seleccionado.ID);
                List<Entidades.Situacion_iva> Lista_situacion_iva = new List<Sistema_financiero.Entidades.Situacion_iva>();
                Lista_situacion_iva = Entidades.Situacion_iva.Obtener_Situacion_iva();
                string iva;
                foreach (Entidades.Situacion_iva S in Lista_situacion_iva)
                {
                    if (S.ID == Buscar_cliente.Cliente_seleccionado.Id_situacion_iva)
                    {
                        iva = Convert.ToString(S.Alicuota);
                        while (iva.Length < 5)
                        {
                            iva = iva + "0";
                        }
                        mtbx_Alicuota_iva.Text = iva;
                        break;
                    }
                }

                btn_Calcular.Enabled = true;
            }
        }

        private void mtbx_Alicuota_iva_Leave(object sender, EventArgs e)
        {
            Control.Textbox_restricciones.Validar_mascara(mtbx_Alicuota_iva, e);
        }

        private void mtbx_Punitorio_Leave(object sender, EventArgs e)
        {
            Control.Textbox_restricciones.Validar_mascara(mtbx_Punitorio, e);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (!String.IsNullOrEmpty(tbx_Num_cliente.Text) && (!String.IsNullOrEmpty(tbx_Importe.Text)) && (!String.IsNullOrEmpty(tbx_Instituto_informe.Text)) && (!String.IsNullOrEmpty(tbx_Numero_cuotas.Text)) &&
                (!mtbx_Sellado.MaskCompleted == false) && (!mtbx_TEM.MaskCompleted == false) && (!mtbx_Punitorio.MaskCompleted == false) && (!mtbx_Fecha_vencimiento.MaskCompleted == false) && (!mtbx_Alicuota_iva.MaskCompleted == false))
            {
                Fecha = Convert.ToDateTime(mtbx_Fecha_vencimiento.Text);

                if (String.IsNullOrEmpty(tbx_Descuento.Text))
                {
                    tbx_Descuento.Text = "0";
                }

                if (String.IsNullOrEmpty(tbx_Comision_fija.Text))
                {
                    tbx_Comision_fija.Text = "0";
                }

                if (String.IsNullOrEmpty(tbx_Comision_por_cuota.Text))
                {
                    tbx_Comision_por_cuota.Text = "0";
                }
                Lista_cuotas = Cargar_lista_cuotas();
                dgv_Cuotas.DataSource = null;
                dgv_Cuotas.DataSource = Lista_cuotas;
                dgv_Cuotas.Columns[0].Visible = false;
                dgv_Cuotas.Columns[8].Visible = false;
                dgv_Cuotas.Columns[9].Visible = false;
                dgv_Cuotas.Columns[1].HeaderText = "Nº";
                dgv_Cuotas.Columns[2].HeaderText = "Fecha de vencimiento";
                dgv_Cuotas.Columns[3].HeaderText = "Amortización";
                dgv_Cuotas.Columns[5].HeaderText = "Comisión";
                dgv_Cuotas.Columns[7].HeaderText = "IVA";
                dgv_Cuotas.Columns[9].HeaderText = "Punitorios Adicionales";
                dgv_Cuotas.AutoResizeColumns();
                dgv_Cuotas.CurrentCell = dgv_Cuotas.Rows[0].Cells[2];
                btn_Aceptar.Enabled = true;

            }
            else
            {
                MessageBox.Show("Quedan campos obligatorios por completar. <Ver resaltados>", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                Control.Textbox_restricciones.Campo_obligatorio(tbx_Num_cliente);
                Control.Textbox_restricciones.Campo_obligatorio(tbx_Importe);
                Control.Textbox_restricciones.Campo_obligatorio(tbx_Instituto_informe);
                Control.Textbox_restricciones.Campo_obligatorio(tbx_Numero_cuotas);
                Control.Textbox_restricciones.Campo_obligatorio(mtbx_Sellado);
                Control.Textbox_restricciones.Campo_obligatorio(mtbx_TEM);
                Control.Textbox_restricciones.Campo_obligatorio(mtbx_Punitorio);
                Control.Textbox_restricciones.Campo_obligatorio(mtbx_Fecha_vencimiento);
                Control.Textbox_restricciones.Campo_obligatorio(mtbx_Alicuota_iva);
            }

        }

        public List<Entidades.Cuota> Cargar_lista_cuotas()
        {
            List<Entidades.Cuota> Lista = new List<Sistema_financiero.Entidades.Cuota>();
            for (int i = 1; i <= Convert.ToInt32(tbx_Numero_cuotas.Text); i++)
            {
                Entidades.Cuota Cuota = new Sistema_financiero.Entidades.Cuota();
                Cuota.Id_prestamo = Convert.ToInt32(tbx_Num_prestamo.Text);
                Cuota.Num_cuota = i;
                Cuota.Fecha_vencimiento = Fecha;
                Cuota.Capital = Decimal.Round((Convert.ToDecimal(tbx_Importe.Text) + Convert.ToDecimal(tbx_Instituto_informe.Text)) / Convert.ToInt32(tbx_Numero_cuotas.Text));
                Cuota.Intereses = Decimal.Round((Entidades.Calcular_cuotas.Calcular_intereses(Convert.ToDecimal(mtbx_TEM.Text), Convert.ToInt32(tbx_Numero_cuotas.Text), Convert.ToInt32(tbx_Importe.Text), Convert.ToInt32(tbx_Instituto_informe.Text), Convert.ToDecimal(mtbx_Sellado.Text))) - (Convert.ToDecimal(tbx_Descuento.Text) / Convert.ToDecimal(tbx_Numero_cuotas.Text)));
                Cuota.Comision = Decimal.Round((Convert.ToDecimal(tbx_Comision_fija.Text) / Convert.ToDecimal(tbx_Numero_cuotas.Text)) + Convert.ToDecimal(tbx_Comision_por_cuota.Text));
                Cuota.Gastos = Decimal.Round(Entidades.Calcular_cuotas.Calcular_sellado(Convert.ToDecimal(mtbx_TEM.Text), Convert.ToInt32(tbx_Numero_cuotas.Text), Convert.ToInt32(tbx_Importe.Text), Convert.ToInt32(tbx_Instituto_informe.Text), Convert.ToDecimal(mtbx_Sellado.Text)));
                Cuota.Punitorios = 0;
                Cuota.Punitorios_adic = 0;
                Cuota.Iva = Decimal.Round(Convert.ToDecimal(mtbx_Alicuota_iva.Text) * (Cuota.Intereses + Cuota.Punitorios + Cuota.Punitorios_adic + Cuota.Comision));
                Cuota.Total = Cuota.Capital + Cuota.Intereses + Cuota.Comision + Cuota.Gastos + Cuota.Punitorios + Cuota.Punitorios_adic + Cuota.Iva;
                Lista.Add(Cuota);
                Fecha = Control.Fecha_dia_habil.Obtener_fecha_habil_30_dias(Fecha);
            }
            return Lista;
        }

        private void mtbx_Fecha_TypeValidationCompleted(object sender, TypeValidationEventArgs e)
        {

                Control.Textbox_restricciones.Validar_fecha(mtbx_Fecha_vencimiento, e);
 
            
        }

        private void mtbx_Fecha_vencimiento_Leave(object sender, EventArgs e)
        {

            
            
        }

        private void mtbx_Fecha_vencimiento_MaskInputRejected(object sender, MaskInputRejectedEventArgs e)
        {

        }

        private void mtbx_Fecha_vencimiento_Validated(object sender, EventArgs e)
        {
            if (mtbx_Fecha_vencimiento.MaskCompleted == true)
            {
                Control.Textbox_restricciones.Fecha_mayor_que(mtbx_Fecha_vencimiento, DateTime.Now);
            }
        }

        private void tbx_Importe_Leave(object sender, EventArgs e)
        {

        }

        private void mtbx_TEM_Leave_1(object sender, EventArgs e)
        {
            Control.Textbox_restricciones.Validar_mascara(mtbx_TEM, e);
        }

        private void btn_Aceptar_Click(object sender, EventArgs e)
        {
            if (!String.IsNullOrEmpty(tbx_Num_cliente.Text) && (!String.IsNullOrEmpty(tbx_Importe.Text)) && (!String.IsNullOrEmpty(tbx_Instituto_informe.Text)) && (!String.IsNullOrEmpty(tbx_Numero_cuotas.Text)) &&
                (!mtbx_Sellado.MaskCompleted == false) && (!mtbx_TEM.MaskCompleted == false) && (!mtbx_Punitorio.MaskCompleted == false) && (!mtbx_Fecha_vencimiento.MaskCompleted == false) && (!mtbx_Alicuota_iva.MaskCompleted == false))
            {
                Entidades.Prestamo Prestamo = new Sistema_financiero.Entidades.Prestamo();

                Prestamo.ID_cliente = Convert.ToInt32(tbx_Num_cliente.Text);
                Prestamo.Importe = Convert.ToDecimal(tbx_Importe.Text);
                Prestamo.Instituto_informe = Convert.ToDecimal(tbx_Instituto_informe.Text);
                Prestamo.Sellado = Convert.ToDecimal(mtbx_Sellado.Text);
                Prestamo.Num_Cuotas = Convert.ToInt32(tbx_Numero_cuotas.Text);
                Prestamo.TEM = Convert.ToDecimal(mtbx_TEM.Text);
                Prestamo.Comision_fija = Convert.ToDecimal(tbx_Comision_fija.Text);
                Prestamo.Comision_x_cuota = Convert.ToDecimal(tbx_Comision_por_cuota.Text);
                Prestamo.Tasa_punitorio = Convert.ToDecimal(mtbx_Punitorio.Text);
                Prestamo.Descuento = Convert.ToDecimal(tbx_Descuento.Text);
                Prestamo.Alicuota_iva = Convert.ToDecimal(mtbx_Alicuota_iva.Text);

                Control.Convertir_coma_decimal_a_punto.Convertir_coma_a_punto();
                Entidades.Prestamo.Guardar_prestamo(Prestamo.ID_cliente, Prestamo.Importe, Prestamo.Instituto_informe, Prestamo.Sellado, Prestamo.Num_Cuotas, Prestamo.TEM, Prestamo.Comision_fija, Prestamo.Comision_x_cuota, Prestamo.Tasa_punitorio, Prestamo.Descuento, Prestamo.Alicuota_iva);

                foreach (Entidades.Cuota C in Lista_cuotas)
                {
                    Entidades.Cuota.Guardar_cuota(C.Id_prestamo, C.Num_cuota, C.Fecha_vencimiento, C.Capital, C.Comision, C.Intereses, C.Gastos, C.Iva, C.Punitorios, C.Punitorios_adic);
                }

                foreach (Entidades.Cliente G in Lista_garantes)
                {
                    Entidades.Cliente.Insertar_prestamo_garante(Convert.ToInt32(tbx_Num_prestamo.Text), G.ID);
                }
                
                Control.Convertir_coma_decimal_a_punto.Convertir_punto_a_coma();
                
                MessageBox.Show("El préstamo ha sido dado de alta con éxito", "Confirmación", MessageBoxButtons.OK, MessageBoxIcon.Information);
                this.Close();
            }
            else
            {
                MessageBox.Show("Quedan campos obligatorios por completar. <Ver resaltados>", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                Control.Textbox_restricciones.Campo_obligatorio(tbx_Num_cliente);
                Control.Textbox_restricciones.Campo_obligatorio(tbx_Importe);
                Control.Textbox_restricciones.Campo_obligatorio(tbx_Instituto_informe);
                Control.Textbox_restricciones.Campo_obligatorio(tbx_Numero_cuotas);
                Control.Textbox_restricciones.Campo_obligatorio(mtbx_Sellado);
                Control.Textbox_restricciones.Campo_obligatorio(mtbx_TEM);
                Control.Textbox_restricciones.Campo_obligatorio(mtbx_Punitorio);
                Control.Textbox_restricciones.Campo_obligatorio(mtbx_Fecha_vencimiento);
                Control.Textbox_restricciones.Campo_obligatorio(mtbx_Alicuota_iva);
            }
        }

        private void tbx_Numero_cuotas_KeyPress(object sender, KeyPressEventArgs e)
        {
            Control.Textbox_restricciones.Permitir_solo_numeros(e);
        }

        private void btn_Nuevo_Click(object sender, EventArgs e)
        {
            frm_Alta_Cliente Nuevo_Cliente = new frm_Alta_Cliente();
            Nuevo_Cliente.ShowDialog();
            if (Nuevo_Cliente.ClienteNuevo != null)
            {
                dgv_Cuotas.DataSource = null;
                tbx_Apellido.Text = Nuevo_Cliente.ClienteNuevo.Apellido;
                tbx_Nombre.Text = Nuevo_Cliente.ClienteNuevo.Nombres;
                tbx_Num_cliente.Text = Convert.ToString(Nuevo_Cliente.ClienteNuevo.ID);
                List<Entidades.Situacion_iva> Lista_situacion_iva = new List<Sistema_financiero.Entidades.Situacion_iva>();
                Lista_situacion_iva = Entidades.Situacion_iva.Obtener_Situacion_iva();
                string iva;
                foreach (Entidades.Situacion_iva S in Lista_situacion_iva)
                {
                    if (S.ID == Nuevo_Cliente.ClienteNuevo.Id_situacion_iva)
                    {
                        iva = Convert.ToString(S.Alicuota);
                        while (iva.Length < 5)
                        {
                            iva = iva + "0";
                        }
                        mtbx_Alicuota_iva.Text = iva;
                        break;
                    }
                }

                btn_Calcular.Enabled = true;
            }
        }

        private void btn_Agregar_Click(object sender, EventArgs e)
        {
            frm_Buscar_Garante Buscar_Garante = new frm_Buscar_Garante();
            Buscar_Garante.ShowDialog();

            if (Buscar_Garante.Cliente_seleccionado != null)
            {
                Lista_garantes.Add(Buscar_Garante.Cliente_seleccionado);

                dgv_Garantes.DataSource = null;
                dgv_Garantes.DataSource = Lista_garantes;
                for (int i = 0; i < dgv_Garantes.ColumnCount; i++)
                {
                    if (i == 1 || i == 2)
                    {
                        dgv_Garantes.Columns[i].Visible = true;
                    }
                    else
                    {
                        dgv_Garantes.Columns[i].Visible = false;
                    }
                }
                
                dgv_Garantes.AutoResizeColumns();
                Enable_disable_quitar_garante(dgv_Garantes.RowCount);
            }
        }

        public void Enable_disable_quitar_garante(int cantidad_filas)
        {
            dgv_Garantes.RowHeadersVisible = false;
            if (cantidad_filas > 0)
            {
                btn_Quitar.Enabled = true;
                dgv_Garantes.CurrentCell = dgv_Garantes.Rows[0].Cells[1];
            }
            else
            {
                btn_Quitar.Enabled = false;
            }
        }

        private void btn_Quitar_Click(object sender, EventArgs e)
        {
            if (dgv_Garantes.RowCount != 0)
            {
                if (MessageBox.Show("¿Desea eliminar este garante?", "Confirmación", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                {
                    Lista_garantes.RemoveAt(dgv_Garantes.CurrentRow.Index);
                    dgv_Garantes.DataSource = null;
                    dgv_Garantes.DataSource = Lista_garantes;
                    for (int i = 0; i < dgv_Garantes.ColumnCount; i++)
                    {
                        if (i == 1 || i == 2)
                        {
                            dgv_Garantes.Columns[i].Visible = true;
                        }
                        else
                        {
                            dgv_Garantes.Columns[i].Visible = false;
                        }
                    }
                    dgv_Garantes.AutoResizeColumns();

                    Enable_disable_quitar_garante(dgv_Garantes.RowCount);
                }
            }
        }

        private void btn_Cancelar_Click(object sender, EventArgs e)
        {
            this.Close();
        }
    }
}
